package webui;

import limfic.dominio.Ciudad;
import limfic.servicios.ciudad.CiudadServicio;

import limfic.servicios.ServicioException;
import limfic.ui.IUsuarioInterfazCiudad;
import com.sun.rave.web.ui.appbase.AbstractPageBean;
import com.sun.rave.web.ui.component.Alert;
import com.sun.rave.web.ui.component.Body;
import com.sun.rave.web.ui.component.Button;
import com.sun.rave.web.ui.component.Label;
import com.sun.rave.web.ui.component.Tab;
import com.sun.rave.web.ui.component.TabSet;
import com.sun.rave.web.ui.component.TextField;
import java.util.Collections;
import java.util.List;
import javax.faces.FacesException;
import javax.faces.component.html.HtmlDataTable;

/**
 * Administracion ciudades. permite alta, baja y eliminacion de ciudades.
 * @version AdministracionCiudad.java
 * @version Created on 03-may-2011, 17:48:38
 * @author OpenCodes
 */
public class AdministracionCiudad extends AbstractPageBean implements IUsuarioInterfazCiudad {
    // <editor-fold defaultstate="collapsed" desc="Managed Component Definition">

    /**
     * <p>Automatically managed component initialization.  <strong>WARNING:</strong>
     * This method is automatically generated, so any user-specified code inserted
     * here is subject to being replaced.</p>
     */
    private CiudadServicio abmCiudadServicio;
    private List<Ciudad> listaCiudades;
    private Alert alerta = new Alert();
    private String mensajeError;

    public List<Ciudad> getListaCiudades() {
        return listaCiudades;
    }

    @Override
    public void setListaCiudades(List<Ciudad> listaCiudades) {
        this.listaCiudades = listaCiudades;
    }

    private void _init() throws Exception {
        if (this.isPostBack()) {
            this.getSessionBean1().paginaAnterior = "";
        }
    }

    public Alert getAlerta() {
        return alerta;
    }

    public void setAlerta(Alert a) {
        this.alerta = a;
    }
    private Button btnAgregar = new Button();

    public Button getBtnAgregar() {
        return btnAgregar;
    }

    public void setBtnAgregar(Button b) {
        this.btnAgregar = b;
    }
    private Button btnModificar = new Button();

    public Button getBtnModificar() {
        return btnModificar;
    }

    public void setBtnModificar(Button b) {
        this.btnModificar = b;
    }
    private Button btnEliminar = new Button();

    public Button getBtnEliminar() {
        return btnEliminar;
    }

    public void setBtnEliminar(Button b) {
        this.btnEliminar = b;
    }
    private HtmlDataTable tablaCiudades = new HtmlDataTable();

    public HtmlDataTable getTablaCiudades() {
        return tablaCiudades;
    }

    public void setTablaCiudades(HtmlDataTable hdt) {
        this.tablaCiudades = hdt;
    }
    private TabSet tabSetCiudades = new TabSet();

    public TabSet getTabSetCiudades() {
        return tabSetCiudades;
    }

    public void setTabSetCiudades(TabSet ts) {
        this.tabSetCiudades = ts;
    }
    private TextField tfNombre = new TextField();

    public TextField getTfNombre() {
        return tfNombre;
    }

    public void setTfNombre(TextField tf) {
        this.tfNombre = tf;
    }
    private Label lblIdCiudad = new Label();

    public Label getLblIdCiudad() {
        return lblIdCiudad;
    }

    public void setLblIdCiudad(Label l) {
        this.lblIdCiudad = l;
    }
    private Tab tabOperaciones = new Tab();

    public Tab getTabOperaciones() {
        return tabOperaciones;
    }

    public void setTabOperaciones(Tab t) {
        this.tabOperaciones = t;
    }
    private Body body = new Body();

    public Body getBody() {
        return body;
    }

    public void setBody(Body b) {
        this.body = b;
    }
    private TextField tfBuscarNombre = new TextField();

    public TextField getTfBuscarNombre() {
        return tfBuscarNombre;
    }

    public void setTfBuscarNombre(TextField tf) {
        this.tfBuscarNombre = tf;
    }
    private Button btnBuscar = new Button();

    public Button getBtnBuscar() {
        return btnBuscar;
    }

    public void setBtnBuscar(Button b) {
        this.btnBuscar = b;
    }
    private Button btnCancelar = new Button();

    public Button getBtnCancelar() {
        return btnCancelar;
    }

    public void setBtnCancelar(Button b) {
        this.btnCancelar = b;
    }


    // </editor-fold>
    /**
     * <p>Construct a new Page bean instance.</p>
     */
    public AdministracionCiudad() {
        obtenerCiudades();

        if (alerta.getSummary() == null) {
            alerta.setVisible(false);
        } else {
            alerta.setVisible(true);
        }
    }

    @Override
    public void init() {
        // Perform initializations inherited from our superclass

        super.init();



        // <editor-fold defaultstate="collapsed" desc="Managed Component Initialization">

        try {
            _init();

        } catch (Exception e) {
            log("AdministracionCiudad Initialization Failure", e);
            throw e instanceof FacesException ? (FacesException) e : new FacesException(e);
        }

    // </editor-fold>

    }

    @Override
    public void preprocess() {
    }

    @Override
    public void prerender() {
        // this.tabSetCiudades.setSelected("tabOperaciones");
    }

    @Override
    public void destroy() {
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected ApplicationBean1 getApplicationBean1() {
        return (ApplicationBean1) getBean("ApplicationBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected SessionBean1 getSessionBean1() {
        return (SessionBean1) getBean("SessionBean1");
    }

    /**
     * <p>Return a reference to the scoped data bean.</p>
     *
     * @return reference to the scoped data bean
     */
    protected RequestBean1 getRequestBean1() {
        return (RequestBean1) getBean("RequestBean1");
    }

    private void obtenerCiudades() {
        try {
            abmCiudadServicio = new CiudadServicio();
            abmCiudadServicio.init(this);
            abmCiudadServicio.listarTodas(this);
        } catch (ServicioException e) {
            //String mensajeError;
            mensajeError = e.toString();
            alerta.setVisible(true);
            alerta.setSummary("Error: " + e.getMessage());
        }
    }

    @Override
    public int getIdCiudad() {
        try {
            Object id;
            id = lblIdCiudad.getText();
            //pregunto si valor del label Id.

            if (id == null) //si esta vacio entonces devuelvo 0 para agregar.
            {
                return 0;
            } else { //si no convierto el valor del label en entero.
                return Integer.valueOf(lblIdCiudad.getText().toString());
            }
        } catch (java.lang.NullPointerException nullExc) {
            return 0;
        }
    }

    @Override
    public String getNombreCiudad() {

        Object nombre;
        nombre = tfNombre.getText();

        if (nombre == null) {
            return "";
        }
        return nombre.toString().toUpperCase(); // convierte a mayusculas

    }

    public String tabOperaciones_action() {
        alerta.setVisible(false);
        alerta.setSummary("");

        body.setFocus("form:tabSetCiudades:tabOperaciones:tfNombre");
        return null;
    }

    public String tabConsultar_action() {

        if (alerta.getType().equals("warning")) {
            alerta.setSummary("");
        }
        body.setFocus("form:tabSetCiudades:tabConsultar:tfBuscarNombre");
        return null;
    }

    public String btnModificar_action() {

        modificarCiudad();

        return null;
    }

    public String btnEliminar_action() {

        eliminarCiudad();
        return null;
    }

    public String btnAgregar_action() {
        agregarCiudad();
        return null;
    }
   
    public String btnCancelar_action() {
        limpiarDatos();
        tabSetCiudades.setSelected("tabConsultar");
        return null;
    }
    public String btnTodos_action() {
        this.tablaCiudades.setRendered(true);
        obtenerCiudades();
        return null;
    }
    // <editor-fold desc="PAGINACION Y ORDENACION">

    public void ordenarListaCiudades(String campo, boolean tipoOrden) {

        if (tipoOrden) { //si es ascendente

            //Ordeno la lista
            Collections.sort(listaCiudades, new CompararCiudad(campo, true));

        } else {

            //Ordeno la lista
            Collections.sort(listaCiudades, new CompararCiudad(campo, false));

        }
        //Actualizo tabla (cambio: ya no es necesario: leo desde la listaJugadores
        //(listaJugadores);
        //Establezco variables de sesion para no perder el ordenado en el postback

        getSessionBean1().sesTablaOrdenada = true;
        getSessionBean1().sesCampoOrden = campo;
    }

    public void ordenarListaPorNombre() {
        //Invierto el orden para siguinte ordenamiento
        // sesOrdenAscendente se usara en los click de la tabla en el tabConsulta.
        getSessionBean1().sesOrdenAscendente = !getSessionBean1().sesOrdenAscendente;
        ordenarListaCiudades("Nombre", getSessionBean1().sesOrdenAscendente);
    }

    public void pageFirst() {
        tablaCiudades.setFirst(0);
    }

    public void pagePrevious() {
        tablaCiudades.setFirst(tablaCiudades.getFirst() - tablaCiudades.getRows());
    }

    public void pageNext() {
        tablaCiudades.setFirst(tablaCiudades.getFirst() + tablaCiudades.getRows());
    }

    public void pageLast() {
        int count = tablaCiudades.getRowCount();
        int rows = tablaCiudades.getRows();
        tablaCiudades.setFirst(count - ((count % rows != 0) ? count % rows : rows));
    }

    public int getCurrentPage() {
        int rows = tablaCiudades.getRows();
        int first = tablaCiudades.getFirst();
        int count = tablaCiudades.getRowCount();
        return (count / rows) - ((count - first) / rows) + 1;
    }

    public int getTotalPages() {
        int rows = tablaCiudades.getRows();
        int count = tablaCiudades.getRowCount();
        return (count / rows) + ((count % rows != 0) ? 1 : 0);
    }
    // </editor-fold>

    // <editor-fold desc="VALIDACIONES">
    public boolean esEntero(String cadena) {

        try {
            int x = Integer.parseInt(cadena);
            return true;
        } catch (NumberFormatException a) {
            return false;
        }
    }

    private boolean validarBuscar() {
        Object buscarNombre;
        buscarNombre = tfBuscarNombre.getText();
        if (buscarNombre == null) {
            mensajeError = "Debe ingresar un nombre";
            body.setFocus("form:tabSetCiudades:tabConsultar:tfBuscarNombre");
            return false;
        }

        return true;
    }

    private boolean validarAgregar() {
        try {

            if (getNombreCiudad().isEmpty()) {
                body.setFocus("form:tabSetCiudades:tabOperaciones:tfNombre");
                mensajeError = "Debe ingresar un nombre";
                return false;
            }
            if (esEntero(getNombreCiudad())) {
                body.setFocus("form:tabSetCiudades:tabOperaciones:tfNombre");
                mensajeError = "Debe ingresar un nombre";
                return false;
            }
            return true;

        } catch (Exception e) {
            mensajeError = "Validacion incorrecta: " + e.getCause();
            return false;
        }
    }

    private boolean validarModificar() {
        try {
            if (getIdCiudad() <= 0) {
                mensajeError = "La identificacion de la ciudad esta vacia";
                return false;
            }
            if (getNombreCiudad().isEmpty()) {
                body.setFocus("form:tabSetCiudades:tabOperaciones:tfNombre");
                mensajeError = "Debe ingresar un nombre";
                return false;
            }
            if (esEntero(getNombreCiudad())) {
                body.setFocus("form:tabSetJugador:tabOperaciones:tfNombre");
                mensajeError = "Debe ingresar un nombre";
                return false;
            }
            return true;

        } catch (Exception e) {
            mensajeError = "Validacion incorrecta: " + e.getCause();
            return false;
        }
    }

    private boolean validarEliminar() {
        try {
            if (getIdCiudad() <= 0) {
                //Esto es en el caso de que no se hayan cargado los datos de la ciudad
                // faltaria eliminar ciudad pasando como parametro el nombre
                if (getNombreCiudad().isEmpty()) {
                    body.setFocus("form:tabSetJugador:tabOperaciones:tfNombre");
                    mensajeError = "Debe ingresar un nombre";
                    return false;
                }
            }

            return true;

        } catch (Exception e) {
            mensajeError = "Validacion incorrecta: " + e.getCause();
            return false;
        }
    }
    // </editor-fold>

    public void editarfilaTabla() {

        try {
            Ciudad c;
            c = (Ciudad) this.tablaCiudades.getRowData();
            String id;
            id = String.valueOf(c.getId());
            lblIdCiudad.setText(id);
            tfNombre.setText(c.getNombre());
            tabSetCiudades.setSelected("tabOperaciones");
        } catch (java.lang.ClassCastException e) {
            alerta.setType("warning");
            alerta.setVisible(true);
            alerta.setSummary("Error al seleccionar los datos (problemas de conversion)");

        }
    }

    public boolean isListaVacia() {
        try {
            return this.listaCiudades.isEmpty();
        } catch (java.lang.NullPointerException e) {
            return false;

        }
    }

    private void limpiarDatos() {
        tfNombre.setText(null);
        alerta.setSummary("");
        alerta.setVisible(false);
        
    }
    private void agregarCiudad() {

        if (isPostBack()) {
            try {
                boolean esValido;
                esValido = validarAgregar();
                if (esValido == false) {
                    alerta.setType("warning");
                    alerta.setVisible(true);
                    alerta.setSummary("Error:" + mensajeError);
                    return;
                }

                abmCiudadServicio = new CiudadServicio();
                abmCiudadServicio.init(this);

                abmCiudadServicio.agregar(this);
                limpiarDatos();
                obtenerCiudades();
                alerta.setType("success");
                alerta.setVisible(true);
                alerta.setSummary("Ciudad guardada con exito");
                tabSetCiudades.setSelected("tabConsultar");
            } catch (ServicioException e1) {
                mensajeError = "Error al agregar una ciudad: ";
                mensajeError = mensajeError.concat(e1.getMessage());
                alerta.setType("warning");
                alerta.setVisible(true);
                alerta.setSummary(mensajeError);
            } catch (javax.faces.FacesException e2) {
                mensajeError = "Error al agregar una ciudad ";
                mensajeError = mensajeError.concat(e2.getCause().toString());
                alerta.setType("warning");
                alerta.setVisible(true);
                alerta.setSummary(mensajeError);
            } catch (java.lang.Exception e3) {
                mensajeError = "Error al agregar una ciudad";
                mensajeError = mensajeError.concat(e3.getCause().toString());
                alerta.setType("warning");
                alerta.setSummary(mensajeError);
            }
        }
    }

    private void modificarCiudad() {

        if (isPostBack()) {
            try {

                boolean esValido = true;
                esValido = validarModificar();
                if (esValido == false) {
                    alerta.setType("warning");
                    alerta.setVisible(true);
                    alerta.setSummary("Error: " + mensajeError);
                    return;
                }
                abmCiudadServicio = new CiudadServicio();
                abmCiudadServicio.init(this);
                abmCiudadServicio.modificar(this);
                alerta.setVisible(true);
                alerta.setType("success");
                alerta.setSummary("Modificacion guardada con exito");

                limpiarDatos();
                tabSetCiudades.setSelected("tabConsultar");

                obtenerCiudades();
            } //Servicio Exception lanzado por el servicio
            catch (ServicioException e1) {
                alerta.setType("warning");
                alerta.setVisible(true);
                alerta.setSummary("Error: " + e1.getMessage());
            } catch (javax.faces.FacesException e2) {
                alerta.setType("warning");
                alerta.setVisible(true);
                alerta.setSummary("Error: " + e2.getMessage());
            } catch (Exception ex4) {
                alerta.setType("warning");
                alerta.setVisible(true);
                alerta.setSummary("Error: " + ex4.getMessage());
            }
        }

    }

    private void eliminarCiudad() {
        if (isPostBack()) {
            try {

                boolean esValido = true;
                esValido = validarEliminar();
                if (esValido == false) {
                    alerta.setType("warning");
                    alerta.setVisible(true);
                    alerta.setSummary("Error: " + mensajeError);
                    return;
                }
                abmCiudadServicio = new CiudadServicio();
                abmCiudadServicio.init(this);
                abmCiudadServicio.eliminar(this);
                limpiarDatos();
                alerta.setVisible(true);
                alerta.setType("success");
                alerta.setSummary("Eliminacion exitosa");
                obtenerCiudades();
                tabSetCiudades.setSelected("tabConsultar");
            } //Servicio Exception lanzado por el servicio
            catch (ServicioException e1) {
                alerta.setType("warning");
                alerta.setVisible(true);
                alerta.setSummary("Error: " + e1.getMessage());
            } catch (javax.faces.FacesException e2) {
                alerta.setVisible(true);
                alerta.setSummary("Error: " + e2.getMessage());
            } catch (Exception ex4) {
                alerta.setVisible(true);
                alerta.setSummary("Error: " + ex4.getMessage());
            }
        }
    }

    public String btnBuscar_action() {
        try {
            //Si es valido tfBuscarNombre y tfBuscarApellido
            if (validarBuscar()) {
                String nombre = tfBuscarNombre.getText().toString();
                abmCiudadServicio = new CiudadServicio();
                abmCiudadServicio.init(this);
                abmCiudadServicio.listarAlgunos(this, nombre);
                //Pregunta por ordenamiento
                if (getSessionBean1().sesTablaOrdenada) {
                    /*  Leo el campoOrden de la sesion y ordeno.
                     *  El tipo de ordenamiento (Ascendete o descendente) ya esta
                     *  cargado en la sesion.*/
                    ordenarListaCiudades(getSessionBean1().sesCampoOrden, getSessionBean1().sesOrdenAscendente);
                }
            } else {
                alerta.setVisible(true);
                alerta.setSummary("Error:" + mensajeError);
            }
        } catch (ServicioException e) {
            mensajeError = e.toString();
            alerta.setVisible(true);
            alerta.setSummary("Error: " + e.getMessage());

        } catch (javax.faces.FacesException e2) {
            alerta.setVisible(true);
            alerta.setSummary("Error: " + e2.getMessage());
        }
        return null;
    }

   


}

